function [data_ais,time_index,mean_pz,data_spline] = preprocess_AIS(data_ais)
%本函数的主要作用是对轨迹进行预处理，主要是对错误值、重复值等进行预处理
%并进行插值处理，从而让原始轨迹可以确保轨迹点之间的时间间隔是一致的
%   重复值不单只连续出现的值，还有长时间间隔出现的值
%主要是踢出错误值，尤其是那些错误出现，导致轨迹线出现多次转折或者显著错误
%data_ais 异常值剔除后的轨迹
%data_spline 异常值位置新的插值数据
%time_index 异常数据对应的time值

%% 船舶锚泊点剔除
%轨迹中出现大角度转折甚至是某个点作为节点多次参与轨迹绘制，导致出现类似扇形或者辐射形状轨迹
%此情形可以设置轨迹角度阈值判断某点是否异常

%% 计算时间间隔，判断是否有时间间隔异常情况，如有，则需要单独处理
time_diff=diff(data_ais.time);%前后点之间的时间间隔
error_time_pos = find(time_diff>300, 1 );


%如果时间间隔有超过阈值的，需要单独处理，否则之间检测轨迹点之间的角度变化
if isempty(error_time_pos)
    % 根据轨迹段之间的夹角判断某轨迹点是否存在异常，并返回异常点可能都位置
    [index_delete, mean_pz]= calculate_points_index(data_ais);
else  %如果时间间隔有明显错误（间隔几小时甚至十几小时时，应该将轨迹进行相应的分段处理
    %如果存在异常（超过标准规定），但在可接受范围内，如间隔十几分钟，则应该进行插值处理
    %当不断删除异常点后，也有可能导致数据的不连贯，间隔时间过长
    chazhi=1;
end

error_index=[];%异常数据在当前数据中的行号
time_index=[];%异常数据对应的时间time值，以备后续差值使用
data_spline=[];%异常点对应的插值数据
%index_delete中的元素可能存在多于1个值得情况
% data_spline={};
for i=1:size(index_delete,1)
    i
    for j=1:size(index_delete{i},2)
        error_index=[error_index;index_delete{i,1}(1,j)];
        time_index = [time_index;index_delete{i,2}(1,j)];
        data_spline=[data_spline;index_delete{i,3}];
        % data_ais.Lon(index_delete{i}(1,j))=index_delete{i,2}(j).Lon;
        % data_ais.Lat(index_delete{i}(1,j))=index_delete{i,2}(j).Lat;
        % data_ais.Course(index_delete{i}(1,j))=index_delete{i,2}(j).Course;       
    end
end

error_index=sort(error_index);
time_index=sort(time_index);
% %保存插值后的轨迹数据,直接替换原有数据即可
% data_spline=data_ais(error_index,:);

%此时获得的异常数据所在的行号为已经剔除重复数据和锚泊数据的行号，因此数值只适合当前，不应该作为返回值
data_ais(error_index,:)=[];


end